Update an existing reader.
  • 12 May 2026
  • 10 Minutes to read
  • Contributors
  • Dark
    Light

Update an existing reader.

  • Dark
    Light

Article summary

Put
/v3/projects/{project_id}/readers/{reader_id}

Updates a reader's name and group associations. When is_invitation_id is false, the endpoint fetches the existing reader record and preserves any fields not provided in the request body, so partial updates are supported. If the reader is not found and is_invitation_id is false, a 404 error is returned. Requires the UpdateRolesAccountsAndGroups permission. Related endpoints: GET /v3/projects/{projectId}/readers to retrieve reader IDs, DELETE /v3/projects/{projectId}/readers/{readerId} to delete a reader.

Security
OAuth

All V3 endpoints require a Bearer token. Generate tokens in the Document360 portal under Settings > API Tokens. Tokens are project-scoped, require the customerApi scope, and do not expire by default. Tokens can be revoked at any time from the portal. Include the token in every request: Authorization: Bearer <your-token>. Alternatively, use the Authorize button below to sign in via OAuth2 Authorization Code flow with PKCE.

FlowAuthorization Code
Authorization URLhttps://identity.document360.net/connect/authorize
Token URLhttps://identity.document360.net/connect/token
Scopes:
customerApiDocument360 Customer API
Path parameters
project_id
string (uuid) Required

The unique identifier of the project. Retrieve project IDs from GET /v3/projects.

Example9a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d
reader_id
string (uuid) Required

The identifier of the reader to update. Retrieve reader IDs from GET /v3/projects/{projectId}/readers.

Example9a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d
Body parameters

Reader update details.

Update reader access and groups

Updates the reader's group membership and expands access to the full project.

{
  "first_name": "John",
  "last_name": "Smith",
  "associated_reader_groups": [
    "b2c3d4e5-f6a7-8b9c-0d1e-2f3a4b5c6d7e",
    "c3d4e5f6-a7b8-9c0d-1e2f-3a4b5c6d7e8f"
  ],
  "access_scope": {
    "access_level": "project",
    "categories": null,
    "project_versions": null,
    "languages": null
  },
  "is_invitation_id": false
}
Expand All
object

Request to update an existing reader's details and access scope.

first_name
string | null

Updated first name of the reader.

last_name
string | null

Updated last name of the reader.

associated_reader_groups
Array of string Required

Updated list of reader group IDs. Replaces all existing group memberships. Retrieve group IDs from GET /v3/projects/{projectId}/readers/groups.

string
access_scope
object Required

Updated access scope for the reader. Replaces the existing access scope.

access_level
string

The level at which access is scoped. Possible values: 0 = None, 1 = Category, 2 = Version, 3 = Project, 4 = Language, 5 = Article, 6 = Workspace.

Valid values[ "none", "category", "version", "project", "language", "article", "workspace" ]
categories
Array of object (CategoryScope) | null

List of specific category scopes when AccessLevel is Category (1). Null or empty for broader access levels.

object

Specifies access to a specific category within a project version and language.

project_version_id
string | null

Unique identifier of the project version containing the category. Retrieve from GET /v3/projects/{projectId}/project-versions.

category_id
string | null

Unique identifier of the category to grant access to. Retrieve from GET /v3/projects/{projectId}/categories.

lang_code
string | null

Language code for the category translation (e.g., "en", "fr", "de"). Retrieve available languages from GET /v3/projects/{projectId}/languages.

Exampleen
project_versions
Array of string | null

List of project version IDs the reader has access to when AccessLevel is Version (2). Retrieve version IDs from GET /v3/projects/{projectId}/project-versions.

string
languages
Array of object (LanguageScope) | null

List of language scopes defining which translations the reader can access. Applicable when AccessLevel is Language (4).

object

Specifies access to a specific language within a project version.

project_version_id
string | null

Unique identifier of the project version. Retrieve from GET /v3/projects/{projectId}/project-versions.

lang_code
string | null

Language code to grant access to (e.g., "en", "fr", "de"). Retrieve available languages from GET /v3/projects/{projectId}/languages.

Exampleen
is_invitation_id
boolean

Set to true if the reader is an SSO reader who hasn't logged in yet and the readerId is an invitation ID rather than a user ID.

Responses
200

Reader updated successfully.

Updated reader

Returns the reader after the update was applied

{
  "data": {
    "id": "d4e5f6a7-b8c9-4d0e-a1b2-c3d4e5f6a7b8",
    "first_name": "Alice",
    "last_name": "Johnson-Lee",
    "email": "[email protected]",
    "access_scope": {
      "access_level": "language",
      "categories": [],
      "project_versions": [],
      "languages": [
        {
          "project_version_id": "f7a8b9c0-d1e2-4f3a-b4c5-d6e7f8a9b0c1",
          "lang_code": "en"
        },
        {
          "project_version_id": "f7a8b9c0-d1e2-4f3a-b4c5-d6e7f8a9b0c1",
          "lang_code": "fr"
        }
      ]
    },
    "associated_reader_groups": [
      "b2c3d4e5-f6a7-4b8c-9d0e-a1b2c3d4e5f6",
      "c8d9e0f1-a2b3-4c4d-e5f6-a7b8c9d0e1f2"
    ],
    "is_invite_sso_user": false,
    "last_login_at": "2025-03-15T10:30:00Z"
  },
  "success": true,
  "request_id": "c3d4e5f6-a7b8-9012-cdef-a23456789012",
  "errors": [],
  "warnings": []
}
Expand All
object

Generic API response wrapper containing typed data.

data
object

Response data payload.

id
string (uuid) | null

Unique identifier of the reader.

Example9a3b4c5d-6e7f-8a9b-0c1d-2e3f4a5b6c7d
first_name
string | null

First name of the reader.

last_name
string | null

Last name of the reader.

email
string (email) | null

Email address of the reader.

access_scope
object | null

The access scope defining which content this reader can view.

access_level
string

The level at which access is scoped. Possible values: 0 = None, 1 = Category, 2 = Version, 3 = Project, 4 = Language, 5 = Article, 6 = Workspace.

Valid values[ "none", "category", "version", "project", "language", "article", "workspace" ]
categories
Array of object (CategoryScope) | null

List of specific category scopes when AccessLevel is Category (1). Null or empty for broader access levels.

object

Specifies access to a specific category within a project version and language.

project_version_id
string | null

Unique identifier of the project version containing the category. Retrieve from GET /v3/projects/{projectId}/project-versions.

category_id
string | null

Unique identifier of the category to grant access to. Retrieve from GET /v3/projects/{projectId}/categories.

lang_code
string | null

Language code for the category translation (e.g., "en", "fr", "de"). Retrieve available languages from GET /v3/projects/{projectId}/languages.

Exampleen
project_versions
Array of string | null

List of project version IDs the reader has access to when AccessLevel is Version (2). Retrieve version IDs from GET /v3/projects/{projectId}/project-versions.

string
languages
Array of object (LanguageScope) | null

List of language scopes defining which translations the reader can access. Applicable when AccessLevel is Language (4).

object

Specifies access to a specific language within a project version.

project_version_id
string | null

Unique identifier of the project version. Retrieve from GET /v3/projects/{projectId}/project-versions.

lang_code
string | null

Language code to grant access to (e.g., "en", "fr", "de"). Retrieve available languages from GET /v3/projects/{projectId}/languages.

Exampleen
associated_reader_groups
Array of string | null

List of reader group IDs that this reader belongs to. Retrieve group IDs from GET /v3/projects/{projectId}/readers/groups.

string
is_invite_sso_user
boolean

Whether this reader was invited via SSO authentication.

last_login_at
string (date-time) | null

Date and time when the reader last logged in. Null if the reader has never logged in.

success
boolean

Whether the API request was successful.

request_id
string

Unique identifier for request tracing and correlation.

Min length1
errors
Array of object (ApiError) | null

List of errors if the request failed.

object

Represents an error returned by the API.

code
string

Machine-readable error code (e.g. VALIDATION_ERROR, RESOURCE_NOT_FOUND).

Min length1
message
string

Human-readable error message.

Min length1
field
string | null

The request field that caused the error, if applicable.

details
string | null

Additional context about the error.

warnings
Array of object (ApiWarning) | null

List of non-fatal warnings from the request.

object

Represents a non-fatal warning from the API.

code
string

Machine-readable warning code.

Min length1
message
string

Human-readable warning message.

Min length1
400

The request body is malformed or contains invalid JSON.

Expand All
object

RFC 7807 Problem Details response for V3 API errors. Content-Type: application/problem+json

type
string

URI reference identifying the error type (links to documentation).

Min length1
title
string

Short human-readable summary of the error type.

Min length1
status
integer (int32)

HTTP status code.

detail
string | null

Human-readable explanation specific to this occurrence.

instance
string | null

URI of the request that generated the error.

trace_id
string | null

Request trace identifier for correlation.

errors
Array of object (ApiError) | null

Structured list of specific errors (extension field).

object

Represents an error returned by the API.

code
string

Machine-readable error code (e.g. VALIDATION_ERROR, RESOURCE_NOT_FOUND).

Min length1
message
string

Human-readable error message.

Min length1
field
string | null

The request field that caused the error, if applicable.

details
string | null

Additional context about the error.

warnings
Array of object (ApiWarning) | null

Non-fatal warnings (extension field).

object

Represents a non-fatal warning from the API.

code
string

Machine-readable warning code.

Min length1
message
string

Human-readable warning message.

Min length1
401

Authentication token is missing or invalid.

Headers
WWW-Authenticate
string
Indicates the authentication scheme required. Returns `Bearer` with optional `error` and `error_description` parameters per RFC 6750.
Missing or invalid token

Authentication token is missing or invalid.

{
  "type": "https://developer.document360.com/errors/unauthorized",
  "title": "Unauthorized.",
  "status": 401,
  "detail": "The authentication token is missing or has expired.",
  "instance": null,
  "trace_id": "req_abc123def456",
  "errors": [
    {
      "code": "UNAUTHORIZED",
      "message": "Bearer token is missing or invalid.",
      "field": null,
      "details": null
    }
  ],
  "warnings": null
}
Expand All
object

RFC 7807 Problem Details response for V3 API errors. Content-Type: application/problem+json

type
string

URI reference identifying the error type (links to documentation).

Min length1
title
string

Short human-readable summary of the error type.

Min length1
status
integer (int32)

HTTP status code.

detail
string | null

Human-readable explanation specific to this occurrence.

instance
string | null

URI of the request that generated the error.

trace_id
string | null

Request trace identifier for correlation.

errors
Array of object (ApiError) | null

Structured list of specific errors (extension field).

object

Represents an error returned by the API.

code
string

Machine-readable error code (e.g. VALIDATION_ERROR, RESOURCE_NOT_FOUND).

Min length1
message
string

Human-readable error message.

Min length1
field
string | null

The request field that caused the error, if applicable.

details
string | null

Additional context about the error.

warnings
Array of object (ApiWarning) | null

Non-fatal warnings (extension field).

object

Represents a non-fatal warning from the API.

code
string

Machine-readable warning code.

Min length1
message
string

Human-readable warning message.

Min length1
404

Reader not found.

Resource not found

The requested resource was not found.

{
  "type": "https://developer.document360.com/errors/not-found",
  "title": "Not Found.",
  "status": 404,
  "detail": "The requested resource does not exist or has been deleted.",
  "instance": null,
  "trace_id": "req_abc123def456",
  "errors": [
    {
      "code": "RESOURCE_NOT_FOUND",
      "message": "The requested resource was not found.",
      "field": null,
      "details": null
    }
  ],
  "warnings": null
}
Expand All
object

RFC 7807 Problem Details response for V3 API errors. Content-Type: application/problem+json

type
string

URI reference identifying the error type (links to documentation).

Min length1
title
string

Short human-readable summary of the error type.

Min length1
status
integer (int32)

HTTP status code.

detail
string | null

Human-readable explanation specific to this occurrence.

instance
string | null

URI of the request that generated the error.

trace_id
string | null

Request trace identifier for correlation.

errors
Array of object (ApiError) | null

Structured list of specific errors (extension field).

object

Represents an error returned by the API.

code
string

Machine-readable error code (e.g. VALIDATION_ERROR, RESOURCE_NOT_FOUND).

Min length1
message
string

Human-readable error message.

Min length1
field
string | null

The request field that caused the error, if applicable.

details
string | null

Additional context about the error.

warnings
Array of object (ApiWarning) | null

Non-fatal warnings (extension field).

object

Represents a non-fatal warning from the API.

code
string

Machine-readable warning code.

Min length1
message
string

Human-readable warning message.

Min length1
429

Rate limit exceeded. Retry after the duration specified in the Retry-After header.

Headers
Retry-After
integer
Number of seconds to wait before retrying the request. Use exponential backoff with jitter for optimal retry behavior.
X-RateLimit-Limit
integer
The maximum number of requests allowed in the current time window. Limits are applied per API token per project.
X-RateLimit-Remaining
integer
The number of requests remaining in the current time window. When this reaches 0, subsequent requests will receive a 429 response.
X-RateLimit-Reset
integer
The UTC epoch timestamp (in seconds) when the current rate limit window resets.
Rate limit exceeded

Rate limit exceeded.

{
  "type": "https://developer.document360.com/errors/too-many-requests",
  "title": "Too Many Requests.",
  "status": 429,
  "detail": "Rate limit exceeded. Retry after the duration specified in the Retry-After header.",
  "instance": null,
  "trace_id": "req_abc123def456",
  "errors": [
    {
      "code": "TOO_MANY_REQUESTS",
      "message": "Rate limit exceeded. Retry after the duration specified in the Retry-After header.",
      "field": null,
      "details": null
    }
  ],
  "warnings": null
}
Expand All
object

RFC 7807 Problem Details response for V3 API errors. Content-Type: application/problem+json

type
string

URI reference identifying the error type (links to documentation).

Min length1
title
string

Short human-readable summary of the error type.

Min length1
status
integer (int32)

HTTP status code.

detail
string | null

Human-readable explanation specific to this occurrence.

instance
string | null

URI of the request that generated the error.

trace_id
string | null

Request trace identifier for correlation.

errors
Array of object (ApiError) | null

Structured list of specific errors (extension field).

object

Represents an error returned by the API.

code
string

Machine-readable error code (e.g. VALIDATION_ERROR, RESOURCE_NOT_FOUND).

Min length1
message
string

Human-readable error message.

Min length1
field
string | null

The request field that caused the error, if applicable.

details
string | null

Additional context about the error.

warnings
Array of object (ApiWarning) | null

Non-fatal warnings (extension field).

object

Represents a non-fatal warning from the API.

code
string

Machine-readable warning code.

Min length1
message
string

Human-readable warning message.

Min length1
500

An unexpected server error occurred.

Unexpected server error

Unexpected server error.

{
  "type": "https://developer.document360.com/errors/internal-error",
  "title": "Internal Server Error.",
  "status": 500,
  "detail": "An unexpected error occurred. Please try again or contact support.",
  "instance": null,
  "trace_id": "req_abc123def456",
  "errors": [
    {
      "code": "INTERNAL_SERVER_ERROR",
      "message": "An unexpected error occurred.",
      "field": null,
      "details": null
    }
  ],
  "warnings": null
}
Expand All
object

RFC 7807 Problem Details response for V3 API errors. Content-Type: application/problem+json

type
string

URI reference identifying the error type (links to documentation).

Min length1
title
string

Short human-readable summary of the error type.

Min length1
status
integer (int32)

HTTP status code.

detail
string | null

Human-readable explanation specific to this occurrence.

instance
string | null

URI of the request that generated the error.

trace_id
string | null

Request trace identifier for correlation.

errors
Array of object (ApiError) | null

Structured list of specific errors (extension field).

object

Represents an error returned by the API.

code
string

Machine-readable error code (e.g. VALIDATION_ERROR, RESOURCE_NOT_FOUND).

Min length1
message
string

Human-readable error message.

Min length1
field
string | null

The request field that caused the error, if applicable.

details
string | null

Additional context about the error.

warnings
Array of object (ApiWarning) | null

Non-fatal warnings (extension field).

object

Represents a non-fatal warning from the API.

code
string

Machine-readable warning code.

Min length1
message
string

Human-readable warning message.

Min length1

Was this article helpful?